{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "city = [[0.4, 0.2439], [0.1707, 0.2293], [0.5171, 0.4439], [0.1463, 0.2293], [0.761, 0.9414], [0.8732, 0.6878], [0.8488, 0.6683], [0.6195, 0.6536], [0.5219, 0.3609], [0.2536, 0.2634]]\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualizer(path):\n",
    "    x = [p[0] for p in city]\n",
    "    y = [p[1] for p in city]\n",
    "    plt.plot(x, y, 'o')\n",
    "    city_reorder = [city[i] for i in path]\n",
    "    x_re = [p[0] for p in city_reorder]\n",
    "    y_re = [p[1] for p in city_reorder]\n",
    "    x_re.append(x_re[0])\n",
    "    y_re.append(y_re[0])\n",
    "    plt.plot(x_re, y_re, linewidth=1, color='red')\n",
    "    plt.savefig(\"path.png\")\n",
    "\n",
    "def exchange(path, pe):\n",
    "    p = np.random.uniform(0, 1)\n",
    "    if p > pe:\n",
    "        return path.copy()\n",
    "    rd1 = np.random.randint(0, 10)\n",
    "    rd2 = np.random.randint(0, 10)\n",
    "    while rd2 == rd1:\n",
    "        rd2 = np.random.randint(0, 10)\n",
    "    tmp = path[rd1]\n",
    "    path[rd1] = path[rd2]\n",
    "    path[rd2] = tmp\n",
    "    return path.copy()\n",
    "\n",
    "def partReverse(path, pr):\n",
    "    p = np.random.uniform(0, 1)\n",
    "    if p > pr:\n",
    "        return path.copy()\n",
    "    rd1 = np.random.randint(0, 10)\n",
    "    rd2 = np.random.randint(0, 10)\n",
    "    while rd2 == rd1:\n",
    "        rd2 = np.random.randint(0, 10)\n",
    "    tmpList = path[rd1:rd2+1].copy()\n",
    "    tmpList = tmpList[::-1].copy()\n",
    "    path[rd1:rd2+1] = tmpList\n",
    "    return path.copy()\n",
    "\n",
    "def insert(path, pI):\n",
    "    p = np.random.uniform(0, 1)\n",
    "    if p > pI:\n",
    "        return path.copy()\n",
    "    rd1 = np.random.randint(0, 10)\n",
    "    rd2 = np.random.randint(0, 10)\n",
    "    while rd2 == rd1:\n",
    "        rd2 = np.random.randint(0, 10)\n",
    "    if rd1 < rd2:\n",
    "        tmpList = path[rd1+1:rd2+1].copy()\n",
    "        tmp = path[rd1]\n",
    "        path[rd1:rd2] = tmpList\n",
    "        path[rd2] = tmp\n",
    "    else:\n",
    "        tmpList = path[rd2:rd1].copy()\n",
    "        tmp = path[rd1]\n",
    "        path[rd2+1:rd1+1] = tmpList\n",
    "        path[rd2] = tmp\n",
    "    return path.copy()\n",
    "\n",
    "def computePointDistance(point1, point2):\n",
    "    return math.sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2)\n",
    "\n",
    "def computePathDistance(path):\n",
    "    totalDistance = 0.0\n",
    "    for i in range(10):\n",
    "        if i == 9:\n",
    "            distance = computePointDistance(city[path[9]], city[path[0]])\n",
    "        else:\n",
    "            distance = computePointDistance(city[path[i]], city[path[i+1]])\n",
    "        totalDistance += distance\n",
    "    return totalDistance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def SA(pe = 1, pr = 1, pI = 1, markov = 20, startT = 168.14, endT = 0.01, k = 0.999):\n",
    "    path = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
    "    random.shuffle(path)\n",
    "    path = np.array(path)\n",
    "    distance = computePathDistance(path)\n",
    "    T = startT\n",
    "    bestPath = path\n",
    "    bestDistance = distance\n",
    "    distance_container = [distance]\n",
    "    bestDistance_container = [bestDistance]\n",
    "    while T >= endT:\n",
    "        for i in range(markov):\n",
    "            tmp = np.random.uniform(0, 1)\n",
    "            if tmp < 0.333:\n",
    "                newPath = exchange(path, pe)\n",
    "            elif tmp < 0.666:\n",
    "                newPath = partReverse(path, pr)\n",
    "            else:\n",
    "                newPath = insert(path, pI)\n",
    "            newDistance = computePathDistance(newPath)\n",
    "            if newDistance < distance:\n",
    "                distance = newDistance\n",
    "                path = newPath\n",
    "                \n",
    "            else:\n",
    "                dE = newDistance - distance\n",
    "                p = math.exp(-dE / T)\n",
    "                rd = np.random.uniform(0, 1)\n",
    "                if rd < p:\n",
    "                    distance = newDistance\n",
    "                    path = newPath\n",
    "            if distance < bestDistance:\n",
    "                bestPath = path.copy()\n",
    "                bestDistance = distance\n",
    "            bestDistance_container.append(bestDistance)\n",
    "            distance_container.append(distance)\n",
    "        T = k * T\n",
    "    return bestPath, bestDistance, distance_container, bestDistance_container"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 9 0 8 6 5 4 7 2 3]\n",
      "2.1704647615559676\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1704647615559676\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "bestPath, bestDistance, distance_container, bestDistance_container = SA(0.5, 0.5, 0.5)\n",
    "print(bestPath)\n",
    "print(bestDistance)\n",
    "# plt.plot(distance_container)\n",
    "# plt.show()\n",
    "plt.plot(bestDistance_container)\n",
    "plt.show()\n",
    "visualizer(bestPath)\n",
    "# print(computePathDistance([0,1,2,3,4,5,6,7,8,9]))\n",
    "print(computePathDistance(bestPath))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T: 1, Avg: 2.171665419372569\n",
      "T: 2, Avg: 2.1707461704880817\n",
      "T: 4, Avg: 2.169957166879362\n",
      "T: 8, Avg: 2.1698093711720974\n",
      "T: 12, Avg: 2.169165859680139\n",
      "T: 16, Avg: 2.1688909735228656\n",
      "T: 20, Avg: 2.1695976608526113\n",
      "T: 24, Avg: 2.1700327586889454\n",
      "T: 28, Avg: 2.169306728196049\n",
      "T: 32, Avg: 2.1687633412658784\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 36215 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 22987 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 28201 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 24230 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 24179 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 22343 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 26368 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 20248 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 20540 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 36215 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 22987 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 28201 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 24230 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 24179 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 22343 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 26368 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 20248 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "c:\\Users\\inspur\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 20540 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T changed to 2 and p changed to 0.5: 2.1780779645097947\n",
      "T changed to 2, p changed to 0.5 and markov changed to 5: 2.1871931879700064\n"
     ]
    }
   ],
   "source": [
    "def changeT():\n",
    "    Ts = [1, 2, 4, 8, 12, 16, 20, 24, 28, 32]\n",
    "    results = []\n",
    "    for T in Ts:\n",
    "        avg = 0.0\n",
    "        for i in range(100):\n",
    "            bestPath, bestDistance, distance_container, bestDistance_container = SA(1, 1, 1, startT=T)\n",
    "            avg += bestDistance\n",
    "        avg /= 100\n",
    "        results.append(avg)\n",
    "        print(\"T: {}, Avg: {}\".format(T, avg))\n",
    "    return Ts, results\n",
    "\n",
    "Ts, results = changeT()\n",
    "plt.plot(Ts, results)\n",
    "plt.xlabel(\"Start T\")\n",
    "plt.ylabel(\"Avg Best Distance\")\n",
    "plt.show()\n",
    "\n",
    "# avg_Tc = 0.0\n",
    "# for i in range(100):\n",
    "#     bestPath, bestDistance, distance_container, bestDistance_container = SA(1, 1, 1, startT=2)\n",
    "#     avg_Tc += bestDistance\n",
    "# avg_Tc /= 100\n",
    "# print(\"T changed to 2:\", avg_Tc)\n",
    "\n",
    "\n",
    "avg_Tc = 0.0\n",
    "for i in range(100):\n",
    "    bestPath, bestDistance, distance_container, bestDistance_container = SA(0.5, 0.5, 0.5, startT=2)\n",
    "    avg_Tc += bestDistance\n",
    "avg_Tc /= 100\n",
    "print(\"T changed to 2 and p changed to 0.5:\", avg_Tc)\n",
    "\n",
    "\n",
    "avg_Tc = 0.0\n",
    "for i in range(100):\n",
    "    bestPath, bestDistance, distance_container, bestDistance_container = SA(1, 1, 1, markov=5, startT=2)\n",
    "    avg_Tc += bestDistance\n",
    "avg_Tc /= 100\n",
    "print(\"T changed to 2, p changed to 0.5 and markov changed to 5:\", avg_Tc)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(Ts, results)\n",
    "plt.xlabel(\"Start T\")\n",
    "plt.ylabel(\"Avg Best Distance\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "79c38198e3a853eeea51b70a0ae21c719ed1444592bdd4a45c4de9d24fbfec7c"
  },
  "kernelspec": {
   "display_name": "Python 3.7.7 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
